package javathread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 与使用Runnable相比， Callable功能更强大些
 *  相比run()方法，可以有返回值
 *  方法可以抛出异常
 *  支持泛型的返回值
 *  需要借助FutureTask类，比如获取返回结果
 * @auther yangdong
 * @create 2020-04-12
 * Future接口
 *  可以对具体Runnable、Callable任务的执行结果进行取消、查询是
 * 否完成、获取结果等。
 *  FutrueTask是Futrue接口的唯一的实现类
 *  FutureTask 同时实现了Runnable, Future接口。它既可以作为
 * Runnable被线程执行，又可以作为Future得到Callable的返回值
 */
public class CallableThread {
    public static void main(String[] args) {
        NewThread newThread=new NewThread();
        FutureTask futureTask=new FutureTask(newThread);
        new Thread(futureTask).start();
        System.out.println("*************************");
        try {
            Object obj=futureTask.get();
            System.out.println(obj);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 实现Callable接口
 */
class NewThread implements Callable{

    @Override
    public Object call() throws Exception {
        int sum=0;
        for (int i = 0; i <100 ; i++) {
            if(i%2==0){
                System.out.println(i);
            }
            sum+=i;
        }
        return sum;
    }
}

